iT邦幫忙

2024 iThome 鐵人賽

DAY 3
1
AI/ ML & Data

菜就多練之我叫小賀逃離DS新手村系列 第 3

Day 3 一生只督你一人-要被監督才肯學習

  • 分享至 

  • xImage
  •  

監督式學習 (Supervised Learning) 🤖

監督式學習是機器學習的一種,透過有標記正確答案的資料建立模型進而去預測未知答案的結果。針對不同的情境和輸出結果可以分為:

  1. 回歸問題 (Regression):

    • 輸出為連續的數值型結果
    • 範例:預測二手車價或氣溫
  2. 分類問題 (Classification):

    • 輸出為離散的類別型結果
    • 範例:預測信用卡是否被盜刷或是否有糖尿病

常見的監督式學習模型 ⚙️

  • 線性回歸 (Linear Regression)
  • 多項式回歸 (Polynomial Regression)
  • 支持向量機 (Support Vector Machine, SVM)
  • 決策樹 (Decision Tree)
  • 隨機森林 (Random Forest)

這裡沒有將模型再歸類為回歸模型或分類模型是因為一個模型隨著不同的情境還有預測結果的改變不全然只局限於一種用途。在開發或使用模型上最重要的是如何定義問題


實戰演練 🔥

俗話說:「女人心,海底針」,鄉民們稱那些不懂女生心思、反應遲鈍、不貼心、很木頭的男生為「直男」。今天為了擺脫這個負面標籤,我希望透過一些特徵 (features) 來預測女朋友的情緒反應。這類型的題目就是分類問題,它的目標變量 (target variable) 可能是開心或生氣。在這個案例中,我們選擇「決策樹」作為我們的分類模型並進行訓練和預測。

程式碼如下:

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import export_graphviz
import graphviz
import numpy as np

# 生成假資料
np.random.seed(0)
data = {
    'sleep_hours': np.random.randint(2, 9, 10),
    'work_stress_level': np.random.randint(1, 6, 10),
    'said_goodnight': np.random.randint(0, 2, 10),  # 0:沒說晚安, 1:有說晚安
    'mood': np.random.choice(['happy', 'angry'], 10)
}

df = pd.DataFrame(data)

# 特徵欄位和目標變量
X = df[['sleep_hours', 'work_stress_level', 'said_goodnight']]
y = df['mood']

# 將標籤轉換為數值
y = y.map({'happy': 0, 'angry': 1})

# 將資料切割成訓練集 (training set) 跟測試集 (test set)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) 

# 建立 Decision Tree 模型
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)

# 預測
y_pred = clf.predict(X_test)

# 評估模型
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')

# 建立新數據並進行預測
new_data = pd.DataFrame({
    'sleep_hours': [7],
    'work_stress_level': [2],
    'said_goodnight': [1]
})

prediction = clf.predict(new_data)
print(f'Prediction for new data: {"happy" if prediction[0] == 1 else "angry"}')

# 畫出決策圖
dot_data = export_graphviz(clf, out_file=None,
    feature_names=['sleep_hours', 'work_stress_level', 'said_goodnight'],
    class_names=['angry', 'happy'],
    filled=True, rounded=True,
    special_characters=True)
graph = graphviz.Source(dot_data)

graph

Code Review 🧐

1. 資料生成

np.random.seed(0)
data = {
    'sleep_hours': np.random.randint(2, 9, 10),
    'work_stress_level': np.random.randint(1, 6, 10),
    'said_goodnight': np.random.randint(0, 2, 10),  # 0: 沒說晚安, 1: 有說晚安
    'mood': np.random.choice(['happy', 'angry'], 10)
}

df = pd.DataFrame(data)
  • np.random.seed() 確保每次生成的資料是一樣的(想像成將這個隨機生成的資料貼一個標籤)。
  • np.random.randint() 用來隨機生成整數型態的資料。
  • np.random.choice() 用來隨機生成指定列表 (list) 裡面的資料。

2. 特徵工程 (feature engineering)

X = df[['sleep_hours', 'work_stress_level', 'said_goodnight']]
y = df['mood']

y = y.map({'happy': 0, 'angry': 1})
  • 特徵選取:將 sleep_hourswork_stress_levelsaid_goodnight 作為判斷目標變量 mood 的 features。
  • 特徵轉換:將 mood 欄位從類別型資料轉換成數值型資料。

3. 資料分割

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
  • 將資料拆成訓練集 (training set) 和測試集 (test set)。
  • 80% training;20% testing。
  • 設定 random_state 確保每次生成的訓練集和測試集是一樣的。

4. 模型訓練與評估

clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')
  • 訓練 Decision Tree 模型。
  • 透過 Accuracy 來評估模型。

5. 產生新數據並進行預測

new_data = pd.DataFrame({
    'sleep_hours': [7],
    'work_stress_level': [2],
    'said_goodnight': [1]
})

prediction = clf.predict(new_data)
print(f'Prediction for new data: {"happy" if prediction[0] == 1 else "angry"}')
  • 將新生成的資料丟入模型並輸出預測結果。

6. 決策樹視覺化

dot_data = export_graphviz(clf, out_file=None, 
    feature_names=['sleep_hours', 'work_stress_level', 'said_goodnight'],  
    class_names=['angry', 'happy'],  
    filled=True, rounded=True,  
    special_characters=True)  
graph = graphviz.Source(dot_data)  

graph
  • 透過 export_graphviz() 將決策樹導出成 Graphviz 格式。
  • 透過 graphviz.Source() 進行視覺化呈現。

建立的假資料如下:

https://ithelp.ithome.com.tw/upload/images/20240807/201557136WoCX90yfx.png


決策圖如下:

https://ithelp.ithome.com.tw/upload/images/20240807/20155713xXPdA5368j.jpg

透過這棵決策樹我們可以進行情緒預測:

  1. 如果睡眠時間小於或等於5.5,則情緒為angry
  2. 如果睡眠時間大於5.5則進一步檢查是否有說晚安
    • 如果沒有說晚安,則情緒為angry
    • 如果有說晚安,則情緒為happy

總結 🔚

因為這個資料集是隨機生成的,所以可以發現這個決策樹結果跟我們所認知的常理可能不太一樣(睡越飽應該越不容易 angry 才對?)。如果想要讓這個研究更加實用,可以開始每天記錄女朋友的習性,透過真實資料訓練出來的模型相信一定比這個隨機生成的模型優秀個 100 倍。

後續在處理任何問題也都會以這樣的模式先定義問題,思考解決方法,最後進行實驗驗證


題外話 😂

我作為十年的 KD 粉雖然沒能夠親眼見證 KD 加冕成為美國隊史得分王(看加拿大 vs 法國到第三節開始就昏睡了哈哈),但必須得說在我心中他毫無疑問是美國男籃的 GOAT 🐐。今年奧運第一場就讓我們見識到為什麼他外號叫 Easy Money,全場 9 投 8 中高效率砍下 23 分,當下我真的看傻了但真的很爽。這次奧運也是詹庫杜的國際賽最後一舞,佔據我大半青春的未來名人堂成員也快退役了😭。


參考資料 💯

Scikit-learn 官網


上一篇
Day 2 小試身手-機器要怎麼學習?
下一篇
Day 4 嚴以律己-不監督也會學習
系列文
菜就多練之我叫小賀逃離DS新手村30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言